<?php
/**
 * Created by PhpStorm.
 * Author: Shadow
 * Date: 2022/5/23
 * Time: 2:34 下午
 * description: TypeBusiness.php
 */

namespace app\adminapi\business;

use app\common\model\Attribute;
use app\common\model\Spec;
use app\common\model\SpecValue;
use think\exception\HttpException;
use think\facade\Db;

/**
 * 类型有关业务逻辑
 * Class TypeBusiness
 * @package app\adminapi\business
 */
class TypeBusiness
{
    /**
     * 添加
     * @param $param
     */
    public static function addType($param)
    {
        # 进行入库-操作的是多张数据表
        # Mysql事务
        // 启动事务
        Db::startTrans();
        try {
            # 进行入库操作
            /**
             * 1.type表 一条数据
             */
            $typeResult = \app\common\model\Type::create(['type_name' => $param['type_name'], 'create_time' => time()]);
            # 知道type表新增id
            $type_id = $typeResult->id;
            # spec表 需要type里面的id
            /**
             * 2.多个规格 、需要批量入库
             */
            $specModel = new Spec();// 创建模型
            $specData = [];// 构造数据
            foreach ($param['spec'] as $value) {
                $specData[] = [
                    'type_id' => $type_id,
                    'spec_name' => $value['name'],
                    'sort' => $value['sort'],
                    'create_time' => time(),
                ];
            }
            // 颜色=》 21 内存 =》 22
            $specResult = $specModel->saveAll($specData);//入库
            /**
             * saveAll方法新增数据返回的是包含新增模型（带自增ID）的数据集对象
             */
            /**
             * 3.spec_value表
             * 星光色 =》 21 粉色 =》 21
             * 256G=》 22 512G=》 22
             * 一个规格名对应多个规格值，需要批量入库
             * 规格值和规格名是关联的
             */
            $specData = $specResult->toArray();// 对规格名的添加结果转化
            $specData = array_column($specData,'id','spec_name');//转化的结果 数组中规格名的id是值、数组中的键是规格名
//            ['颜色' => 22,'内存' => 23]; == $specData
            $specValueModel = new SpecValue();
            $specValueData = [];
            foreach ($param['spec'] as $value) {
//                ['name' => "颜色", 'sort' => 1, 'value' => ['星光色','午夜色','粉色'],] == $value
                foreach ($value['value'] as $item) {
                    $specValueData[] = [
                        'spec_id' => $specData[$value['name']],// 规格名的id
                        'spec_value' => $item,//规格值
                        'type_id' => $type_id,
                        'create_time' => time()
                    ];
                }
            }
            $specValueModel->saveAll($specValueData);

            /**
             * 4.attribute 表
             */
            self::addAttr($param,$type_id);

            // 提交事务
            Db::commit();
            return true;
        } catch (\Exception $e) {
            abort(4003, '添加失败');
            // 回滚事务
            Db::rollback();
        }
    }

    /**
     * 添加属性
     * @param $param
     * @param $type_id
     * @throws \Exception
     */
    protected static function addAttr($param,$type_id){
        $attrModel = new Attribute();
        $attrData = [];
        foreach ($param['attr'] as $items) {
//                ['name' => "产地", 'sort' => 1, 'value' => ['中国大陆','香港'],],
            $attrData[] = [
                'attr_name' => $items['name'],// 属性名
                'type_id' => $type_id,
                'attr_values' => implode(',',$items['value']),//将数组转化为字符串
                'sort' => $items['sort'],
                'create_time' => time()
            ];
        }
        $attrModel->saveAll($attrData);
    }

    /**
     * 删除类型
     */
    public static function delete($id){

        # 当前模型下面是否有上架商品是不能删除

//        $isGoods = \app\common\model\Goods::where('is_on_sale',1)->where('type_id',$id)->select()->toArray();

        # 是否有商品
        $isGoods = \app\common\model\Goods::where('type_id',$id)->select()->toArray();
        if (count($isGoods) > 0) {
            abort(4003,"该类型下面有商品、不能删除");
        }

        // 启动事务
        Db::startTrans();
        try {
            # 删除规格值表
            $valueRes = SpecValue::where('type_id',$id)->delete();

            # 删除规格名表
            $specRes = Spec::where('type_id',$id)->delete();

            # 删除属性表
            $attrRes = Attribute::where('type_id',$id)->delete();

            # 删除模型表
            $typeRes = \app\common\model\Type::destroy($id);

            // 提交事务
            if (!$valueRes || !$specRes || !$attrRes || !$typeRes) {
                abort(4003,'删除失败');
            }
            Db::commit();
            return true;
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
            abort($e->getCode(),$e->getMessage());
        }catch (HttpException $httpException) {
            Db::rollback();//回滚事务
            abort($httpException->getStatusCode(),$httpException->getMessage());
        }

    }

}